package qc.module.cms.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.exception.QCPromptException;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.common.core.utils.DateUtil;
import qc.module.cms.dto.ledview.LedViewDto;
import qc.module.cms.entity.LedView;
import qc.module.cms.mapper.LedViewMapper;
import qc.module.cms.repository.LedViewRepository;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * LedViewService
 *
 * @author QuCheng Tech
 * @since 2023/12/20
 */
@Service
public class LedViewService {
    private LedViewRepository repository;

    @Autowired
    public void setLedViewRepository(LedViewRepository repository) {
        this.repository = repository;
    }

    /**
     * 获取指定时间需要显示的画面集合；不管LED画面是否为固定，只要是在指定的时间点内需要显示的都返回
     *
     * @param date 指定的时间
     * @return java.util.List<qc.module.cms.dto.ledview.LedViewDto>
     * @author QuCheng Tech
     * @since 2023/12/20
     */
    public List<LedViewDto> getDisplayViews(Date date) {
        //查询数据
        LambdaQueryWrapper<LedView> wrapper = new LambdaQueryWrapper<>();

        //查询条件，beginTime<=date && endTime>=date
        wrapper.le(LedView::getBegintm, date);
        wrapper.ge(LedView::getEndtm, date);
        //排序，按id降序，后加入的先显示
        wrapper.orderByDesc(LedView::getId);

        List<LedView> ens = repository.selectList(wrapper);
        if (ens != null && ens.size() > 0x0)
            return LedViewMapper.MAPPER.toDtoList(ens);

        return null;
    }

    /**
     * 获取所有的Led画面
     *
     * @return java.util.List<qc.module.cms.dto.ledview.LedViewDto>
     * @author QuCheng Tech
     * @since 2023/12/26
     */
    public List<LedViewDto> getAll() {
        LambdaQueryWrapper<LedView> wrapper = new LambdaQueryWrapper<>();

        //排序，按添加的顺序降序排列，后添加的画面排在前面
        wrapper.orderByDesc(LedView::getId);

        //查询数据
        List<LedView> list = repository.selectList(wrapper);
        if (list != null && list.size() > 0x0) {
            List<LedViewDto> result = new ArrayList<>();

            for (LedView en : list) {
                LedViewDto dto = LedViewMapper.MAPPER.toDto(en);
                //起止日期转换处理
                if (en.getBegintm() != null)
                    dto.setBegintm(DateUtil.getDateTimeString(en.getBegintm()));
                if (en.getEndtm() != null)
                    dto.setEndtm(DateUtil.getDateTimeString(en.getEndtm()));

                result.add(dto);
            }
            
            return result;
        }

        return null;
    }

    /**
     * 获取指定id的画面信息
     *
     * @param id 画面ID
     * @return qc.module.cms.dto.link.LinkDto
     * @author QuCheng Tech
     * @since 2023/12/26
     */
    public LedViewDto get(Integer id) throws QCPromptException {
        if (id == null)
            throw new QCPromptException("大屏画面ID不能为空");

        LedView en = repository.selectById(id);

        if (en != null) {
            LedViewDto dto = LedViewMapper.MAPPER.toDto(en);
            //起止日期转换处理
            if (en.getBegintm() != null)
                dto.setBegintm(DateUtil.getDateTimeString(en.getBegintm()));
            if (en.getEndtm() != null)
                dto.setEndtm(DateUtil.getDateTimeString(en.getEndtm()));
            return dto;
        }

        return null;
    }

    /**
     * 新增Led画面
     *
     * @param dto 大屏画面对象
     * @return java.lang.String
     * @author QuCheng Tech
     * @since 2023/12/26
     */
    public String add(LedViewDto dto) {
        if (dto == null)
            return QCUnifyReturnValue.Warn("对象不能为空");
        if (StringUtils.isBlank(dto.getName()))
            return QCUnifyReturnValue.Warn("画面名称不能为空");
        //判断名称不能重复
        if (isNameHasExist(dto.getName(), 0x0))
            return QCUnifyReturnValue.Warn("画面名称已存在，名称不能相同");

        //DTO转换为Entity
        LedView en = LedViewMapper.MAPPER.toEntity(dto);

        en.setId(genereateId());
        //起止日期转换处理
        if (!StringUtils.isBlank(dto.getBegintm())) {
            //转换失败时设置为空
            Date date = DateUtil.parseDate(dto.getBegintm());
            if (date != null)
                en.setBegintm(date);
        }
        if (!StringUtils.isBlank(dto.getEndtm())) {
            //转换失败时设置为空
            Date date = DateUtil.parseDate(dto.getEndtm());
            if (date != null)
                en.setEndtm(date);
        }

        if (repository.insert(en) < 0x1)
            return QCUnifyReturnValue.Warn("保存失败");

        return QCUnifyReturnValue.Success();
    }

    /**
     * 修改Led画面信息
     *
     * @param dto 画面信息
     * @return java.lang.String
     * @author QuCheng Tech
     * @since 2023/12/26
     */
    public String update(LedViewDto dto) {
        if (dto == null)
            return QCUnifyReturnValue.Warn("对象不能为空");
        if (dto.getId() < 0x1)
            return QCUnifyReturnValue.Warn("画面ID不能为空");
        if (StringUtils.isBlank(dto.getName()))
            return QCUnifyReturnValue.Warn("画面名称不能为空");

        //DTO转换为Entity
        LedView en = LedViewMapper.MAPPER.toEntity(dto);
        //起止日期转换处理
        if (!StringUtils.isBlank(dto.getBegintm())) {
            //转换失败时设置为空
            Date date = DateUtil.parseDate(dto.getBegintm());
            if (date != null)
                en.setBegintm(date);
        }
        if (!StringUtils.isBlank(dto.getEndtm())) {
            //转换失败时设置为空
            Date date = DateUtil.parseDate(dto.getEndtm());
            if (date != null)
                en.setEndtm(date);
        }

        //判断名称不能重复
        if (isNameHasExist(en.getName(), en.getId()))
            return QCUnifyReturnValue.Warn("链接名称已存在，名称不能相同");

        repository.updateById(en);

        return QCUnifyReturnValue.Success();
    }

    /**
     * 删除，物理删除
     *
     * @param id 要删除的画面ID
     * @return java.lang.String
     * @author QuCheng Tech
     * @since 2023/12/26
     */
    public String delete(Integer id) {
        if (id == null)
            return QCUnifyReturnValue.Warn("要删除的大屏画面ID不能为空");

        if (!hasIdExist(id))
            return QCUnifyReturnValue.Warn("要删除的大屏画面不存在");

        repository.deleteById(id);

        return QCUnifyReturnValue.Success();
    }

    /**
     * 判断指定的ID是否存在
     *
     * @param id 链接ID
     * @return true表示已存在，false表示不存在
     * @author QuCheng Tech
     * @since 2023/5/26
     */
    public boolean hasIdExist(Integer id) {
        LambdaQueryWrapper<LedView> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(LedView::getId, id);

        LedView en = repository.selectOne(wrapper);
        if (en != null)
            return true;

        return false;
    }

    /**
     * @param name 名称
     * @param id   ID，新增时设置ID为0，修改时设置ID为记录ID
     * @return true表示名称已存在，false表示名称不存在
     * @author QuCheng Tech
     * @since 2023/5/25
     */
    boolean isNameHasExist(String name, Integer id) {
        //验证名称是否重复条件：name=name and id<>id
        LambdaQueryWrapper<LedView> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(LedView::getName, name);
        wrapper.ne(LedView::getId, id);

        LedView en = repository.selectOne(wrapper);
        if (en != null)
            return true;

        return false;
    }

    /**
     * 生成记录ID，获取数据库表中的最大记录ID+1
     *
     * @return 生成记录ID
     * @author QuCheng Tech
     * @since 2023/5/25
     */
    Integer genereateId() {
        Integer maxRecordId = getMaxId();
        return maxRecordId + 1;
    }

    /**
     * 获取数据库表中的最大ID值，没有记录时返回0
     *
     * @return 返回数据库表中的最大ID值
     * @author QuCheng Tech
     * @since 2023/5/25
     */
    Integer getMaxId() {
        LambdaQueryWrapper<LedView> wrapper = new LambdaQueryWrapper<>();
        wrapper.select(LedView::getId);
        wrapper.orderByDesc(LedView::getId);
        LedView en = repository.selectOne(wrapper);
        if (en != null)
            return en.getId();

        return 0x0;
    }
}
